//package com.lagou.edu.config;
//
//import com.lagou.edu.annotations.A;
//import com.lagou.edu.annotations.C;
//import com.lagou.edu.annotations.T;
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationContext;
//import org.springframework.context.ApplicationContextAware;
//import org.springframework.jdbc.datasource.DataSourceTransactionManager;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationHandler;
//import java.lang.reflect.Method;
//import java.lang.reflect.Proxy;
//
////@Component
//public class MyApplicationContextAware implements ApplicationContextAware {
//
//    @Autowired
//    DataSourceTransactionManager dataSourceTransactionManager;
//
//    @Override
//    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//        applicationContext.getBeansWithAnnotation(C.class).forEach((key,obj)->{
//            for (Field field : obj.getClass().getDeclaredFields()){
//                if (field.isAnnotationPresent(A.class)){
//                    field.setAccessible(true);
//                    try {
//                        field.set(obj,applicationContext.getBean(field.getType()));
//                    } catch (IllegalAccessException e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
//        });
//    }
//
//
//    /**
//     * custom transfer intercept
//     * @param bean
//     */
//    private Object importTransaction(Object bean){
//        if (bean.getClass().isAnnotationPresent(T.class)){
//            Object proxyObject =  Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
//                @Override
//                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                    Object invokeObject = null;
//                    try {
//                        invokeObject = method.invoke(bean, args);
//                        dataSourceTransactionManager.getDataSource().getConnection().commit();
//                    }catch (Exception e){
//                        dataSourceTransactionManager.getDataSource().getConnection().rollback();
//                        throw e;
//                    }
//                    return invokeObject;
//                }
//            });
//            return proxyObject;
//        }
//        return bean;
//    }
//
//
//}
